#!/usr/bin/python
# -*- coding: utf-8 -*- 
# 图像直线检测程序（需OpenCV库支持）

import cv2
import math

# 读取原始图像，cv2.IMREAD_COLOR表示3通道BGR格式
img = cv2.imread("pic.png", cv2.IMREAD_COLOR) 

# 转换为灰度图
imggray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯模糊降噪（核尺寸3x3）
imggray = cv2.GaussianBlur(imggray, (3,3), 0)

# 自适应二值化处理
# 参数说明：80为阈值，255为最大值，INV表示黑白反转
ret, imgbinary = cv2.threshold(imggray, 80, 255, cv2.THRESH_BINARY_INV)

# Canny边缘检测，50,150两个阈值比值应在1：2与1：3之间
# edges = cv2.Canny(imggray, 100, 200, apertureSize=3)

# 统计概率霍夫线变换
# threshold 检测一条直线所需的最少极坐标曲线交点数
threshold = 500    
# minLineLength 组成一条直线的最小长度
minLineLength = 500 
#maxLineGap 两条直线为同一条直线的最大间隙（允许连接断裂的最大距离）
maxLineGap = 100     

# 执行概率霍夫变换
lines = cv2.HoughLinesP(imgbinary, 1, math.pi/180, 
                       threshold, minLineLength, maxLineGap)

#在原图上绘制直线
'''
for l in lines:
	for x1,y1,x2,y2 in l:
		cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
'''
# 遍历检测到的直线（当前仅绘制第一条直线）
for x1,y1,x2,y2 in lines[0]:
    # (0,255,0)为BGR绿色，1为线宽
    cv2.line(img, (x1,y1), (x2,y2), (0,255,0), 1)

# 显示带检测结果的图像
cv2.imshow("img", img)
# 注：在图片窗口弹出后，键入任意键关闭窗口并结束程序
cv2.waitKey()  # 等待键盘输入
cv2.destroyAllWindows()  # 清理窗口资源
